package com.jhws.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogHelper {
	/**
	 * 是否开启Debug
	 */
	private static boolean isDebug = true;

	private static final Logger logger = LoggerFactory.getLogger(LogHelper.class);
	
	public static Logger getLogger(){
		return logger;
	}
	
	public static Logger getLogger(Class<?> c){
		return LoggerFactory.getLogger(c);
	}
	
	public static Logger getLogger(String name){
		return LoggerFactory.getLogger(name);
	}


	/**
	 * 输出日志所包含的信息
	 */
	private static String getLogInfo(String message) {
		StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[3];
		StringBuilder logInfoStringBuilder = new StringBuilder();
		// 获取文件名.即xxx.java
		String fileName = stackTraceElement.getFileName();
		// 获取类名.即包名+类名
		String className = stackTraceElement.getClassName();
		// 获取方法名称
		String methodName = stackTraceElement.getMethodName();
		// 获取生日输出行数
		int lineNumber = stackTraceElement.getLineNumber();
		logInfoStringBuilder
				.append("\n \t at ")
				.append(className)
				.append(".")
				.append(methodName)
				.append("(")
				.append(fileName)
				.append(":")
				.append(lineNumber)
				.append(")\n \t ")
				.append(message)
				.append("\n");
		return logInfoStringBuilder.toString();
	}

	/**
	 * Trace 输出
	 *
	 * @param message 输出信息
	 */
	public static void t(String message) {
		if (!isDebug) return;
		logger.trace(getLogInfo(message));
	}

	/**
	 * Debug 输出
	 *
	 * @param message 输出信息
	 */
	public static void d(String message) {
		if (!isDebug) return;
		logger.debug(getLogInfo(message));
	}

	/**
	 * Info 输出
	 */
	public static void i(String message){
		if (!isDebug) return;
		logger.info(getLogInfo(message));
	}

	/**
	 * Debug 输出
	 *
	 * @param fmtString 输出信息key
	 * @param value     输出信息value
	 */
	public static void fd(String fmtString, Object... value) {
		if (!isDebug) return;
		if (StringUtils.isEmpty(fmtString)) {
			return;
		}
		if (null != value && value.length != 0) {
			fmtString = String.format(fmtString, value);
		}
		logger.debug(getLogInfo(fmtString));
	}

	/**
	 * Error 输出
	 *
	 * @param message 输出信息
	 */
	public static void e(String message) {
		logger.error(getLogInfo(message));
	}

	/**
	 * Error 输出
	 *
	 * @param message 输出信息
	 * @param e       异常类
	 */
	public static void e(String message, Exception e) {
		if (null == e) {
			logger.error(getLogInfo(message));
			return;
		}
		logger.error(getLogInfo(message), e);
	}

	/**
	 * 异常填充值输出
	 *
	 * @param fmtString 输出信息key
	 * @param e         异常类
	 * @param value     输出信息value
	 */
	public static void fmtError(Exception e, String fmtString, Object... value) {
		if (StringUtils.isEmpty(fmtString)) {
			return;
		}
		if (null != value && value.length != 0) {
			fmtString = String.format(fmtString, value);
		}
		logger.error(getLogInfo(fmtString), e);
	}

	/**
	 * 异常填充值输出
	 *
	 * @param fmtString 输出信息key
	 * @param value     输出信息value
	 */
	public static void fe(String fmtString, Object... value) {
		if (StringUtils.isBlank(fmtString)) {
			return;
		}
		if (null != value && value.length != 0) {
			fmtString = String.format(fmtString, value);
		}
		logger.error(getLogInfo(fmtString));
	}
}
